package com.xbh.common;

import com.jfinal.aop.AopManager;
import com.jfinal.config.*;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.cron4j.Cron4jPlugin;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.render.ViewType;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import com.xbh.common.model._MappingKit;
import com.xbh.dms.service.LoginSrv;
import com.xbh.dms.service.StuService;
import com.xbh.dms.service.impl.LoginSrvImpl;
import com.xbh.dms.service.impl.StuServiceImpl;
import com.xbh.interceptor.MyActionInterceptor;
import com.xbh.realtime.tio.websocket.WebSocketStarter;

public class JFinal_DemoConfig extends JFinalConfig {

    public static void main(String[] args) {
        UndertowServer.start(JFinal_DemoConfig.class);
    }

    static Prop p;

    static void loadConfig(){
        if(p == null){
            p = PropKit.useFirstFound("demo-config-dev.txt");
        }
    }

    @Override
    public void configConstant(Constants constants) {

//        加载配置
        loadConfig();
//        设置开发模式
        constants.setDevMode(p.getBoolean("devMode"));
//        依赖注入
        constants.setInjectDependency(p.getBoolean("injectDependency"));
//        超类的属性注入
        constants.setInjectSuperClass(p.getBoolean("injectSuperClass"));
//        配置视图类型  默认即为  JFINAL_TEMPLATE
        constants.setViewType(ViewType.JFINAL_TEMPLATE);

        AopManager.me().addMapping(StuService.class, StuServiceImpl.class);
        AopManager.me().addMapping(LoginSrv.class, LoginSrvImpl.class);
    }

    @Override
    public void configRoute(Routes routes) {

//         4.9.03新增的路由扫描
        routes.scan("com.xbh.");
//        设置 视图 的 基路径
//        routes.setBaseViewPath("/template");
    }

    @Override
    public void configEngine(Engine engine) {

    }

    @Override
    public void configPlugin(Plugins plugins) {

        DruidPlugin druidPlugin = createDruidPlugin();
//        配置 druid 数据库连接池插件
        plugins.add(druidPlugin);
//        配置ActiveRecordPlugin
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
//        使用sql enjoy
        arp.addSqlTemplate("demo.sql");
//        所有映射在 MappingKit 中自动化搞定
        _MappingKit.mapping(arp);
        plugins.add(arp);
//        System.out.println(PropKit.get("redisHost") + " " +
//                toInt(PropKit.get("redisPort")) + " " +
//                toInt(PropKit.get("redisTimeOut")) + " " +
//                PropKit.get("redisPass") + " " +
//                toInt(PropKit.get("redisDataBase")));
//        添加 redisPlugin
        RedisPlugin redisPlugin0 = new RedisPlugin(
                "stu",
                PropKit.get("redisHost"),
                toInt(PropKit.get("redisPort")),
                toInt(PropKit.get("redisTimeOut")),
                PropKit.get("redisPass"),
                toInt(PropKit.get("redisDataBase0"))
        );
        plugins.add(redisPlugin0);
        RedisPlugin redisPlugin1 = new RedisPlugin(
                "tokenCache",
                PropKit.get("redisHost"),
                toInt(PropKit.get("redisPort")),
                toInt(PropKit.get("redisTimeOut")),
                PropKit.get("redisPass"),
                toInt(PropKit.get("redisDataBase1"))
        );
        plugins.add(redisPlugin1);
        RedisPlugin redisPlugin2 = new RedisPlugin(
                "messageQueue",
                PropKit.get("redisHost"),
                toInt(PropKit.get("redisPort")),
                toInt(PropKit.get("redisTimeOut")),
                PropKit.get("redisPass"),
                toInt(PropKit.get("redisDataBase2"))
        );
        plugins.add(redisPlugin2);
//        添加cron4j任务调度插件 第一种配置方式
        /*Cron4jPlugin cron4jPlugin = new Cron4jPlugin();
        cron4jPlugin.addTask("* * * * *", new MyRunnableImpl());
        plugins.add(cron4jPlugin);*/
//        第二种配置方式 读取的四种方式
//        Cron4jPlugin cron4jPlugin = new Cron4jPlugin("cron4j-config.txt");
//        Cron4jPlugin cron4jPlugin = new Cron4jPlugin("cron4j-config.txt", "cron4j");
        Cron4jPlugin cron4jPlugin = new Cron4jPlugin(PropKit.use("cron4j-config.txt"));
//        Cron4jPlugin cron4jPlugin = new Cron4jPlugin(PropKit.use("cron4j-config.txt"), "cron4j");
        plugins.add(cron4jPlugin);

        // 启动tio_websocket server
        plugins.add(new WebSocketStarter());
    }

    public static DruidPlugin createDruidPlugin() {
//        必须要再加载一次  要不 >>NullPointerException
        loadConfig();
        return new DruidPlugin(p.get("jdbcUrl"), p.get("user"), p.get("password"));
    }

    @Override
    public void configInterceptor(Interceptors interceptors) {
        // 添加全局权限拦截器
        interceptors.add(new MyActionInterceptor());
    }

    @Override
    public void configHandler(Handlers handlers) {

    }

    /*
     * @description: 将字符串转化为 Integer
     * @param str 要转换的字符串
     * @return: java.lang.Integer
     * @author: ZBoHang
     * @time: 2021/7/26 14:37
     */
    private Integer toInt(String str) {
        return Integer.parseInt(str);
    }
}
